/**
 * MailServer es reponsable de comunicarse con los objetos MailCliente para
 * proporcionarle los servicios necesarios.
 * 
 */
package server;

import listas.HandlerList;
import client.MailClient;
import mensaje.Message;

/**
 *
 * @author Lab-214-21
 * @version 1.0.0
 */
public class MailServer {
    private String nameServer;
    private HandlerList listas;
 
    /**
     * Contructor de la clase, recibe como parametro el nombre con el cual
     * se identificara al servidor posteriormente.
     * @param nombre 
     */
    public MailServer(String nombre) {     
        nameServer = nombre;
        listas = new HandlerList();
    }
    
    /**
     * Método que obtiene el número de mensajes esperando para el usuario que 
     * los solicita.
     * @param name String
     * @return int Un entero que es el resultado
     */
    public int getMessagesWaiting(String name){
        int cont = 0;
        for (int i = 0; i < listas.cantidadMensajes(); i++) {
            Message mensaje  = listas.obtenerMensajePosicion(i);
            cont = validarUsuarioNombre(mensaje,name,cont);
        }
        return cont;
    }
    
    private int validarUsuarioNombre(Message mensaje, String nombreCliente,int cont){
        if (mensaje.compararDestino(nombreCliente)) {
            cont ++;
            return cont;
        }     
        return cont;
    }
    
    /**
     * Método que devuelve el siguiente mensaje para el usuario que lo solicita.
     * @param name String
     * @return Message Un objeto Message con el mensaje del usuario
     */
    public Message getNextMessage(String name){ 
        Message mensajeAutenticado = null;
        for (int i = 0; i < listas.cantidadMensajes(); i++) {
            Message mensaje = listas.obtenerMensajePosicion(i); 
            mensajeAutenticado = validarMensajeDestinatario(mensaje, name, mensajeAutenticado,i);           
        }        
        return mensajeAutenticado;
    }
    
    public Message validarMensajeDestinatario(Message mensaje,String nombreComparar, 
            Message mensajeAutenticado,int posicion){
        if (mensajeAutenticado != null) {
            return mensajeAutenticado;
        }
        if (mensaje.compararDestino(nombreComparar)) {
            listas.eliminarMensajePosicion(posicion);
            return mensaje;
        }
        return null;
    }
    
    /**
     * Método que lista todos los mensajes pendientes que tiene el servidor
     * de correo.
     */
    public void listarMensajes(){
        for (int i = 0; i < listas.cantidadMensajes(); i++) {
            Message mensajeObtenido = listas.obtenerMensajePosicion(i);
            System.out.println(mensajeObtenido.toString());
        }
    }
    
    /**
     * Metodo que recibe los mensajes a enviar. y los almacena en un LinkedList de
     * Mensages por enviar.
     * @param message 
     */
    public void post(Message message){        //hecho
        listas.agregarMensaje(message);
    }   

    public void addMailClient(MailClient client){
        listas.agregarCliente(client);
    }    
}
